//1.导入axios模块
import axios from 'axios'
//导入token工具包
import {
  saveToken,
  removeToken,
  getToken
} from './token.js'
//导入Toast
import {
  Toast
} from 'vant'
//导入router  这个是原型中的 $router
import router from '@/router/index.js'

//2.创建axios自定义实例
const instance = axios.create({
  baseURL: 'http://toutiao.itheima.net/', //线上基地址
  timeout: 10000, //设置网络超时，超过10秒直接作废
})

/* 添加请求拦截器，自动上传token */
instance.interceptors.request.use(
  function (config) {
    //如果用户有登录，就自动添加token
    if (getToken()) {
      config.headers.Authorization = 'Bearer ' + getToken().token
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

/* 添加响应拦截器，拦截token过期的401错误 */
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    // console.log(response)
    return response
  },
  async function (error) {
    // 对响应错误做点什么: 响应错误比如参数错误，或者没有登录等
    /*
    复杂逻辑分析： 401分为两种情况
      第一种： 用户有登录，只是token过期了。 这个时候就需要刷新token
      第二种： 用户没有登录，这个时候就需要跳转登录页
    思路整理
      判断状态码是不是401
      
       1.是401,判断用户没有token
        1.1 有token,说明token过期，需要请求刷新token
          1.1.1 成功：更新token,返回当前页
          1.1.2 失败：说明refresh过期，需要重新登录
        1.2 没有token，说明用户未登录，需要重新登录  
       2.不是401，说明是其他问题，例如404路径错误，这个不做处理
    
    */
    //判断状态码是否401 与 token是否存在
    // 判断状态码是不是401
    if (error.response.status === 401) {
      //1.是401,判断用户没有token
      if (getToken()) {
        //1.1 有token,说明token过期，需要请求刷新token
        /* 使用try-catch捕捉异常 */
        try {
          //刷新token
          const tokenRes = await axios({
            url: 'http://toutiao.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: {
              Authorization: `Bearer ${getToken().refresh_token}`
            }
          })
          //1.1.1 成功：更新token,返回当前页
          console.log('更新了token:' + tokenRes)
          let newToken = getToken()
          newToken.token = tokenRes.data.data.token
          saveToken(newToken)
          // 返回当前配置信息
          return instance(error.config)
        } catch (err) {
          //1.1.2 失败：说明refresh过期，需要重新登录
          //弹窗提示
          Toast.fail('请重新登录')
          //移除token
          removeToken()
          //跳转登录页
          router.push('/login')
        }
      } else {
        //1.2 没有token，说明用户未登录，需要重新登录
        //弹窗提示
        Toast.fail('请重新登录')
        //跳转登录页
        router.push('/login')
      }
    } else {
      //2.不是401，说明是其他问题，例如404路径错误，这个不做处理
    }

    /* 如果觉得token过期控制台爆红看着不舒服，就可以手动清除控制台打印 */
    setTimeout(() => {
      console.clear()
    }, 2000)
    return Promise.reject(error)
  }
)

//3.导出模块
export default instance
